package ar.com.grupo1.ler.dominio;

import java.math.BigDecimal;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.log4j.Logger;

import ar.com.grupo1.ler.exceptions.ValoresInvalidosException;

public class CamionAcoplado extends Vehiculo {

	private static Logger logger = Logger.getLogger(CamionAcoplado.class);

	public static final long CARGA_MAXIMA = 20000;
	public static final long LIMITE_KG_PARA_VIAJES = 10000;
	public static final long LIMITE_KG_PARA_CONSUMO = 1000;
	public static final BigDecimal FACTOR_HASTA_3000_KG = new BigDecimal( "75" );
	public static final BigDecimal FACTOR_HORA = new BigDecimal( "1.0" );
	public static final BigDecimal FACTOR_LITROS_X_KM_BUEN_ESTADO = new BigDecimal(
			"1.0");
	public static final BigDecimal FACTOR_LITROS_X_KM_MAL_ESTADO = new BigDecimal(
			"0.3");
	
	@Override
	public Long getCargaMaxima() {
		return CARGA_MAXIMA;
	}

	@Override
	public BigDecimal getTiempoViaje(Viaje viaje)
			throws ValoresInvalidosException {
		
		verificarViaje(viaje);
		Long cantKg = viaje.getCarga();
		BigDecimal cantKmBuenEstado = viaje.getRuta().getCantKmEnBuenEstado();
		BigDecimal cantKmMalEstado = viaje.getRuta().getCantKmEnMalEstado();
		
		BigDecimal tiempoViaje = null;
		BigDecimal factorADividir1 = new BigDecimal( "90" );
		BigDecimal factorADividir2 = new BigDecimal( "70" );
		BigDecimal sumador1 = null;
		BigDecimal sumador2 = null;
		BigDecimal recargo = new BigDecimal( "1.3" ); 
		
		//cant de km buen estado / 90
		sumador1 = cantKmBuenEstado.divide(factorADividir1, 2, BigDecimal.ROUND_HALF_EVEN);		
		//cant de km mal estado / 70
		sumador2 = cantKmMalEstado.divide(factorADividir2, 2, BigDecimal.ROUND_HALF_EVEN);
		//suma de los anteriores
		tiempoViaje = sumador1.add(sumador2);
		//suma de una hora
		tiempoViaje = tiempoViaje.add(FACTOR_HORA);
		
		if (cantKg > LIMITE_KG_PARA_VIAJES) 
		{
			//mas de 10000 kg, recargo del 30%
			tiempoViaje = tiempoViaje.multiply(new BigDecimal(recargo.toString()));
		}
		
		logger.debug("Tiempo: 1 hora + cantidad de Km's en buen estado del viaje [" + cantKmBuenEstado
				+ "] / factor [" + factorADividir1
				+ "] + cantidad de Km's en mal estado del viaje [" + cantKmMalEstado
				+ "] / factor [" + factorADividir2
				+"]. La cantidad de Kg's a transportar son ["+ cantKg +"]");
		
		return tiempoViaje;
	}

	@Override
	public BigDecimal getConsumoCombustible(Viaje viaje)
			throws ValoresInvalidosException {
		
		verificarViaje(viaje);
		Long cantKg = viaje.getCarga();
		BigDecimal cantKmBuenEstado = viaje.getRuta().getCantKmEnBuenEstado();
		BigDecimal cantKmMalEstado = viaje.getRuta().getCantKmEnMalEstado();
		BigDecimal cantTotalKm = viaje.getRuta().getCantTotalKm();
		
		BigDecimal consumoCombustible1 = null;
		BigDecimal consumoCombustible2 = null;
		BigDecimal resultado = null;
		BigDecimal factorAMultBuenEstado = null;
		BigDecimal factorAMultMalEstado = null;
		Long factor = null;
		
		if (cantKg != null && cantKmBuenEstado != null && cantKmMalEstado != null) {
			
			factorAMultBuenEstado = FACTOR_LITROS_X_KM_BUEN_ESTADO;
			factorAMultMalEstado = FACTOR_LITROS_X_KM_MAL_ESTADO;
			
			//1 * cant total de km * carga/1000
			consumoCombustible1 = factorAMultBuenEstado.multiply(new BigDecimal(cantTotalKm.toString()));
			factor=cantKg/1000;
			consumoCombustible1 = factorAMultBuenEstado.multiply(new BigDecimal(factor.toString()));
			//0.3 * cant total de km
			consumoCombustible2 = factorAMultMalEstado.multiply(new BigDecimal(cantTotalKm.toString()));
			//suma de los anteriores
			resultado = consumoCombustible1.add(consumoCombustible2);
				
			logger.debug("Consumo: Cantidad de Km's ["
							+ cantTotalKm
							+ "] * factor ["
							+ factorAMultBuenEstado
							+ "] * carga/1000 + cantidad de Km's ["
							+ cantTotalKm
							+ "] * factor ["
							+ factorAMultMalEstado
							+ "]. La cantidad de Kg's a transportar son ["
							+ cantKg + "]");
		} else {
			throw new ValoresInvalidosException(
					"El camion acoplado necesita datos que estan en null - cantKg ["
							+ cantKg + "], cantKmBuenEstado [" + cantKmBuenEstado 
							+ "], cantKmMalEstado [" + cantKmMalEstado + "]");
		}

		return resultado;
	}
	
	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
	
	private void verificarViaje(Viaje viaje) throws ValoresInvalidosException {
		if (viaje == null || viaje.getCarga() == null
				|| viaje.getTiempoMaximo() == null || viaje.getRuta() == null
				|| viaje.getRuta().getCantTotalKm() == null
				|| viaje.getRuta().getCantKmEnBuenEstado() == null) {
			throw new ValoresInvalidosException(
					"El camion acoplado necesita datos del viaje que estan en null ["
							+ viaje + "]");
		}
	}
	
}
